/*
- @Author: Wangjun
- @Date: 2023-08-15 19:03:33

  - @LastEditTime: 2023-10-16 09:27:10

  - @LastEditors: Wangjun

- @Description:
  - @FilePath: \nodex\value_bool.go

- hnxr
*/
package nodex

import (
	"errors"
	"fmt"
)

type StringValue struct {
	Value string //输出
	Bad   *bool
}

func (m *StringValue) Equal(o Outter) bool {
	v, ok := o.(*StringValue)
	if ok {
		return v.Value == m.Value
	}
	return false
}

func (m *StringValue) New() Outter {
	return NewStringValue()
}

func (m *StringValue) Set(o Outter) (err error) {
	v, ok := o.(*StringValue)
	if ok {
		m.Value = v.Value
	}
	return errors.New("数据类型不一致")
}

func NewStringValue(bs ...string) *StringValue {
	b := new(StringValue)
	b.Bad = new(bool)
	if len(bs) > 0 {
		b.Value = bs[0]
	}
	return b
}

type String struct {
	ID       string `json:"id"`
	Edge     string `json:"edge"`
	PrevPort string `json:"PP"`
	*StringValue
}

func (m *String) CopyAttr(v Valuer) {
	val := v.(*String)
	m.ID = val.ID
	m.Edge = val.Edge
	m.PrevPort = val.PrevPort
	m.Value = val.Value
}

func (m *String) SetValue(val any) (err error) {
	if val == nil {
		return
	}
	m.Value = fmt.Sprint(val)
	return
}

func (m *String) SetID(id string) {
	m.ID = id
}

func (m *String) GetID() string {
	return m.ID
}

/**
 * @description: 获取上一个连接点
 * @return {*}
 */
func (m *String) GetPrevPort() string {
	return m.PrevPort
}

func (m *String) SetPrevPort(prev string) {
	m.PrevPort = prev
}
func (m *String) GetType() string {
	return "string"
}

// 设置线
func (m *String) SetEdge(edge string) {
	m.Edge = edge
}

/**
 * @description: 设置值关联
 * @param {Valuer} value
 * @return {*}
 */
func (m *String) Link(value Valuer) (err error) {
	if m.GetType() != value.GetType() {
		err = errors.New("参数不一致")
		return
	}
	if v, ok := value.(*String); ok {
		//fmt.Printf("link :%p->%p\n", m.StringValue, v.StringValue)
		v.StringValue = m.StringValue
	}
	return
}

// []bool 类型
type ArrayStringValue struct {
	Value []bool //输出
	Bad   *bool
}

func (m *ArrayStringValue) Equal(o Outter) bool {
	v, ok := o.(*ArrayStringValue)
	if ok {
		if len(v.Value) != len(m.Value) {
			return false
		}
		for i := range m.Value {
			if v.Value[i] == m.Value[i] {
				continue
			}
			return false
		}

		return true
	}
	return false
}

func (m *ArrayStringValue) New() Outter {
	return NewStringValue()
}

func (m *ArrayStringValue) Set(o Outter) (err error) {
	v, ok := o.(*ArrayStringValue)
	if ok {
		m.Value = v.Value
	}
	return errors.New("数据类型不一致")
}

func NewArrayStringValue() *ArrayStringValue {
	b := new(ArrayStringValue)
	b.Bad = new(bool)
	return b
}

type ArrayString struct {
	ID                string `json:"id"`
	Edge              string `json:"edge"`
	PrevPort          string `json:"PP"`
	*ArrayStringValue        //输出
}

func (m *ArrayString) CopyAttr(v Valuer) {
	val := v.(*ArrayString)
	m.ID = val.ID
	m.Edge = val.Edge
	m.PrevPort = val.PrevPort
	copy(m.Value, val.Value)
}
func (m *ArrayString) GetID() string {
	return m.ID
}
func (m *ArrayString) SetID(id string) {
	m.ID = id
}

func (m *ArrayString) GetType() string {
	return "[]string"
}

/**
 * @description: 获取上一个连接点
 * @return {*}
 */
func (m *ArrayString) GetPrevPort() string {
	return m.PrevPort
}

// 设置线
func (m *ArrayString) SetEdge(edge string) {
	m.Edge = edge
}
func (m *ArrayString) SetPrevPort(prev string) {
	m.PrevPort = prev
}

// 数组的设置值功能暂不支持
func (m *ArrayString) SetValue(val any) (err error) {
	if val == nil {
		return
	}
	// v := fmt.Sprint(val)
	// v = strings.TrimSpace(v)
	// if v == "" {
	// 	return
	// }
	// m.Value, err = strconv.ParseFloat(v, 64)
	// if err != nil {
	// 	*m.Bad = true
	// }
	return
}

/**
 * @description: 设置值关联
 * @param {Valuer} value
 * @return {*}
 */
func (m *ArrayString) Link(value Valuer) (err error) {
	if m.GetType() != value.GetType() {
		err = errors.New("参数不一致")
		return
	}
	if v, ok := value.(*ArrayString); ok {
		v.ArrayStringValue = m.ArrayStringValue
		return
	}
	return errors.New("参数不一致")
}
